#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
打包脚本
使用PyInstaller将程序打包成exe文件
"""

import os
import sys
import subprocess
import shutil


def install_pyinstaller():
    """安装PyInstaller"""
    print("正在安装PyInstaller...")
    try:
        subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'pyinstaller'])
        print("PyInstaller安装成功")
        return True
    except subprocess.CalledProcessError:
        print("PyInstaller安装失败")
        return False


def build_exe():
    """构建exe文件"""
    print("开始构建exe文件...")
    
    # 使用python -m pyinstaller而不是直接调用pyinstaller
    cmd = [
        sys.executable, '-m', 'PyInstaller',  # 使用python -m PyInstaller
        '--onefile',                    # 打包成单个exe文件
        '--console',                    # 显示控制台窗口（改为console）
        '--name=ToolBox',              # 指定exe文件名
        '--add-data=plugins;plugins',   # 包含plugins目录
        '--add-data=config.json;.',     # 包含配置文件
        '--hidden-import=plugins.calculator',      # 隐式导入所有插件
        '--hidden-import=plugins.http_server',
        '--hidden-import=plugins.system_info',
        '--hidden-import=plugins.text_tools',
        '--hidden-import=plugins.app_launcher',
        '--distpath=dist',              # 指定输出目录
        '--workpath=build',             # 指定工作目录
        'main.py'                      # 主程序文件
    ]
    
    # 如果有图标文件，添加图标参数
    if os.path.exists('icon.ico'):
        cmd.insert(-1, '--icon=icon.ico')  # 在main.py之前插入
    
    try:
        print(f"执行命令: {' '.join(cmd)}")
        subprocess.check_call(cmd, cwd=os.getcwd())
        print("构建成功！")
        print("exe文件位置: dist/ToolBox.exe")
        return True
    except subprocess.CalledProcessError as e:
        print(f"构建失败: {e}")
        return False
    except FileNotFoundError as e:
        print(f"找不到PyInstaller: {e}")
        print("请确保PyInstaller已正确安装")
        return False


def clean_build():
    """清理构建文件"""
    print("清理构建文件...")
    
    dirs_to_remove = ['build', '__pycache__']
    files_to_remove = ['ToolBox.spec']
    
    for dir_name in dirs_to_remove:
        if os.path.exists(dir_name):
            shutil.rmtree(dir_name)
            print(f"已删除目录: {dir_name}")
            
    for file_name in files_to_remove:
        if os.path.exists(file_name):
            os.remove(file_name)
            print(f"已删除文件: {file_name}")


def main():
    """主函数"""
    print("=" * 50)
    print("           多功能工具箱打包工具")
    print("=" * 50)
    
    # 检查是否安装了PyInstaller
    try:
        import PyInstaller
        print("PyInstaller已安装")
    except ImportError:
        print("PyInstaller未安装，正在安装...")
        if not install_pyinstaller():
            print("无法安装PyInstaller，请手动安装: pip install pyinstaller")
            return
            
    # 构建exe
    if build_exe():
        print("\n构建完成！")
        print("你可以在 dist 目录中找到 ToolBox.exe 文件")
        
        # 询问是否清理构建文件
        choice = input("\n是否清理构建文件？(y/N): ").strip().lower()
        if choice == 'y':
            clean_build()
    else:
        print("构建失败，请检查错误信息")


if __name__ == "__main__":
    main()